home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / mail / mh / contrib / jpeek / xrefile < prev   
Text File  |  1992-08-08  |  4KB  |  134 lines

  1. #! /bin/sh
  2. # $Header: /home/jerry/.bin/RCS/xrefile,v 1.3 92/08/09 23:26:37 jerry mh_contrib $
  3. #
  4. ###    xrefile - refile mail from current account to another
  5. ###    Usage: xrefile -u other_username [msgs] [+remote-folder]
  6. ##
  7. ##    LIKE refile, BUT COPIES MESSAGES TO OTHER ACCOUNT AND THEM rmm'S.
  8. ##    NICER THAN dist BECAUSE IT PRESERVES THE ORIGINAL MESSAGE DATE
  9. ##    AND ETC.  NICER THAN forw BECAUSE THE ORIGINAL MESSAGE ISN'T
  10. ##    BURIED INSIDE DASHED LINES, BECAUSE IT DOESN'T TRASH THE STARTS
  11. ##    OF DASHED LINES IN THE ORIGINAL MESSAGE, AND BECAUSE pick CAN FIND
  12. ##    THE ORIGINAL MESSAGE WITHOUT NEEDING TO USE -search.
  13. ##
  14. ##    WATCH OUT: xrefile COPIES MESSAGES INTO A HIDDEN SUBDIRECTORY OF
  15. ##    /tmp FOR LONG ENOUGH TO TRANSFER THEM.  IF xrefile BOMBS BEFORE
  16. ##    IT FINISHES, IT COULD LEAVE MESSAGES UNDER /tmp.  (IT WON'T REMOVE
  17. ##    THE MESSAGES FROM THE SOURCE FOLDER, THOUGH, UNTIL THEY'RE IN THE
  18. ##    OTHER ACCOUNT'S FOLDER -- SO YOU WON'T LOSE MESSAGES IN A CRASH.)
  19. #
  20. #    NOTE TO HACKERS: TABSTOPS SET AT 4 IN THIS CODE
  21. #
  22. #    USE AT YOUR OWN RISK.  SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY!
  23. #    PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com
  24.  
  25. mh=/usr/local/mh        # WHERE mh COMMANDS LIVE
  26. tmpdir=/tmp/.XFRDIR$$    # HIDDEN TEMPORARY DIRECTORY FOR MAIL TRANSFER
  27. tmpscr=/tmp/.XFRSCR$$    # HIDDEN TEMPORARY SHELL SCRIPT; COPIES MESSAGES
  28.  
  29. stat=1    # ERROR EXIT STATUS (RESET TO 0 FOR NORMAL EXITS)
  30. trap 'rm -rf $tmpdir $tmpscr; exit $stat' 0 1 2 15
  31.  
  32. myname="`basename $0`"
  33. usage="$myname -u other_username [msgs] [+remote-folder]"
  34.  
  35. # PARSE COMMAND LINE:
  36. while :
  37. do
  38.     case $# in
  39.     0)    break ;;
  40.     esac
  41.  
  42.     case "$1" in
  43.     -u)    case "$2" in
  44.         "")    echo "Usage: $usage
  45.             (Missing user name after -u)" 1>&2
  46.             exit
  47.             ;;
  48.         *)    user="$2"
  49.             shift    # SHIFT OFF -u (WILL shift $2 AT END OF LOOP)
  50.             ;;
  51.         esac
  52.         ;;
  53.     +*)    rmtfolder="$1" ;;
  54.     *)    msgs="$msgs $1" ;; # IT'S A MESSAGE (WE HOPE...)
  55.     esac
  56.  
  57.     shift
  58. done
  59.  
  60. case "$user" in
  61. "")    echo "Usage: $usage
  62.     (missing -u)" 1>&2
  63.     exit
  64.     ;;
  65. esac
  66.  
  67. if mkdir $tmpdir
  68. then chmod 711 $tmpdir    # OTHER ACCOUNT WILL KNOW EXACT FILENAMES
  69. else
  70.     echo "${myname}: problem making '$tmpdir' directory.  Quitting." 1>&2
  71.     exit
  72. fi
  73.  
  74. : ${msgs=cur}    # IF NO MESSAGES GIVEN, USE cur
  75.  
  76. # GO TO THE CURRENT FOLDER AND GET MESSAGE LIST.
  77. # DO THIS TO MAKE PATHNAMES SHORTER; AVOIDS TOO-LONG COMMAND LINES:
  78. srcfolder="`$mh/mhpath`" || {
  79.     echo "${myname}: fatal: can't get current folder name?!?" 1>&2
  80.     exit
  81. }
  82. cd "$srcfolder" || {
  83.     echo "${myname}: fatal: 'cd $srcfolder' bombed." 1>&2
  84.     exit
  85. }
  86. # GET LIST OF MESSAGES; LET cp COMPLAIN IF IT CAN'T READ THEM...
  87. # (WE CAN'T JUST USE $msgs BECAUSE IT MIGHT HAVE last:10, ETC.)
  88. # USE tr TO CHANGE NEWLINES TO SPACES SO $xfrscr DOESN'T BOMB:
  89. cpfrom="`$mh/mhpath $msgs | sed \"s@^$srcfolder/@@\" | tr '\012' ' '`" || {
  90.     echo "${myname}: fatal: 'mhpath \$msgs | sed' bombed." 1>&2
  91.     exit
  92. }
  93.  
  94.  
  95. # MAKE THE SHELL SCRIPT THAT $user'S ACCOUNT WILL USE.  IT BOMBS (-e)
  96. # AND DOESN'T PUT MESSAGE IN $xfr_done FILE IF ANYTHING FAILS:
  97. echo "#! /bin/sh -e
  98. # FILE-COPYING SCRIPT MADE BY $USER
  99. cd $tmpdir
  100. for msg in $cpfrom
  101. do cp -i \$msg \`$mh/mhpath new $rmtfolder\`
  102. done
  103. # IF WE GET HERE, NOTHING BOMBED AND cp -i DIDN'T GET ANY n ANSWERS.
  104. # RETURN STATUS TO su SHELL (AND FROM THERE TO CALLING PROGRAM):
  105. exit 0" > $tmpscr
  106.  
  107. chmod +x $tmpscr || exit
  108.  
  109. # NOW THAT WE'VE GOT THE SCRIPT, COPY THE MESSAGES TO $tmpdir
  110. # (LEAVE THEM THERE AS SHORT A TIME AS WE CAN...)
  111. cp -i $cpfrom $tmpdir || {
  112.     echo "${myname}: fatal: 'cp $cpfrom $tmpdir' bombed." 1>&2
  113.     exit
  114. }
  115.  
  116. cd $tmpdir    # MUST BE HERE OR su BOMBS (IF MH directory PROTECTED)
  117. chmod 644 * || {
  118.     echo "${myname}: fatal: 'chmod 644 *' bombed." 1>&2
  119.     exit
  120. }
  121.  
  122. # DO THE COPY (NOT ALL SYSTEMS LET YOU DO su -f TO A BOURNE SHELL!):
  123. echo -n "$user "    # PUT USERNAME BEFORE Password:
  124. su $user -c $tmpscr
  125. case $? in
  126. 0)    $mh/rmm $cpfrom
  127.     stat=0
  128.     ;;
  129. *)    echo "$myname: Something went wrong with the copying...
  130.     I won't remove the source messages." 1>&2 ;;
  131. esac
  132.  
  133. exit
  134.